import java.util.Stack;

public class TestDemo {




/*
* . 逆波兰表达式求值
* https://leetcode.cn/problems/valid-parentheses/description/
* */
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack=new Stack<>();

        for(int i=0;i<tokens.length;i++){
            String str=tokens[i];
            if(!isOpertion(str)){
                int val=Integer.valueOf(str);
                stack.push(val);

            }else{
                int num1=stack.pop();
                int num2=stack.pop();
                switch(str){
                    case "+":
                        stack.push(num2+num1);
                        break;
                    case "-":
                        stack.push(num2-num1);
                        break;
                    case "*":
                        stack.push(num2*num1);
                        break;
                    case "/":
                        stack.push(num2/num1);
                        break;
                }

            }

        }
        return stack.pop();
    }

    public boolean isOpertion(String str){

        //判断是否为有效运算符
        if(str.equals("+")||str.equals("-")||str.equals("*")||str.equals("/")){
            return true;
        }
        return false;
    }
/*
https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId=13&&tqId=11174&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking
*JZ31 栈的压入、弹出序列
* 输入两个整数序列，第一个序列表示栈的压入顺序，请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序，序列4,5,3,2,1是该压栈序列对应的一个弹出序列，但4,3,5,1,2就不可能是该压栈序列的弹出序列。
1. 0<=pushV.length == popV.length <=1000
2. -1000<=pushV[i]<=1000
3. pushV 的所有数字均不相同
*
* [1,2,3,4,5],[4,5,3,2,1]
* true
* 说明：
可以通过push(1)=>push(2)=>push(3)=>push(4)=>pop()=>push(5)=>pop()=>pop()=>pop()=>pop()
这样的顺序得到[4,5,3,2,1]这个序列，返回true
* [1,2,3,4,5],[4,3,5,1,2]
* false
由于是[1,2,3,4,5]的压入顺序，[4,3,5,1,2]的弹出顺序，要求4，3，5必须在1，2前压入，且1，2不能弹出，但是这样压入的顺序，1又不能在2之前弹出，所以无法形成的，返回false
* */
    public boolean IsPopOrder (int[] pushV, int[] popV) {
        // write code here

        Stack<Integer> stack=new Stack<>();
        int count=0;
        for(int i=0;i<pushV.length;i++){
            stack.push(pushV[i]);
            while(!stack.isEmpty()&&count<popV.length && stack.peek()==popV[count]){
                stack.pop();
                count++;
            }

        }

        return stack.isEmpty();
    }
    public static void main(String[] args) {

    }
}
